widget: Add css-classes property
authorTimm Bäder <mail@baedert.org>
Sat, 15 Feb 2020 08:55:27 +0000 (09:55 +0100)
committerTimm Bäder <mail@baedert.org>
Sat, 15 Feb 2020 16:18:26 +0000 (17:18 +0100)
Mirroring the values added and removed via {add,remove}_css_class().

docs/reference/gtk/gtk4-sections.txt
gtk/gtkwidget.c
gtk/gtkwidget.h

index 8b91e2dfab6335b1911214c5861876aee74f8bc4..a7b1be5e5e4e97c7f1cd479791d3f796b8b7c468 100644 (file)
@@ -4191,6 +4191,8 @@ gtk_widget_get_css_name
 gtk_widget_add_css_class
 gtk_widget_remove_css_class
 gtk_widget_has_css_class
+gtk_widget_get_css_classes
+gtk_widget_set_css_classes
 
 <SUBSECTION>
 gtk_widget_get_style_context
index 5ea1f97613050882a6467247cb8061db1be39eed..4090a45616a1a8053f4870c4e9b43de830407daa 100644 (file)
@@ -557,6 +557,7 @@ enum {
   PROP_EXPAND,
   PROP_SCALE_FACTOR,
   PROP_CSS_NAME,
+  PROP_CSS_CLASSES,
   PROP_LAYOUT_MANAGER,
   NUM_PROPERTIES
 };
@@ -1325,6 +1326,18 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                            NULL,
                            GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
 
+  /**
+   * GtkWidget:css-classes:
+   *
+   * A list of css classes applied to this widget.
+   */
+  widget_props[PROP_CSS_CLASSES] =
+      g_param_spec_boxed ("classes",
+                          P_("Style Classes"),
+                          P_("List of classes"),
+                          G_TYPE_STRV,
+                          GTK_PARAM_READWRITE);
+
   /**
    * GtkWidget:layout-manager:
    *
@@ -1886,6 +1899,9 @@ gtk_widget_set_property (GObject         *object,
       if (g_value_get_string (value) != NULL)
         gtk_css_node_set_name (priv->cssnode, g_quark_from_string (g_value_get_string (value)));
       break;
+    case PROP_CSS_CLASSES:
+      gtk_widget_set_css_classes (widget, g_value_get_boxed (value));
+      break;
     case PROP_LAYOUT_MANAGER:
       gtk_widget_set_layout_manager (widget, g_value_dup_object (value));
       break;
@@ -2032,6 +2048,9 @@ gtk_widget_get_property (GObject         *object,
     case PROP_CSS_NAME:
       g_value_set_string (value, g_quark_to_string (gtk_css_node_get_name (priv->cssnode)));
       break;
+    case PROP_CSS_CLASSES:
+      g_value_take_boxed (value, gtk_widget_get_css_classes (widget));
+      break;
     case PROP_LAYOUT_MANAGER:
       g_value_set_object (value, gtk_widget_get_layout_manager (widget));
       break;
@@ -13141,6 +13160,7 @@ gtk_widget_add_css_class (GtkWidget  *widget,
   g_return_if_fail (css_class[0] != '.');
 
   gtk_css_node_add_class (priv->cssnode, g_quark_from_string (css_class));
+  g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_CSS_CLASSES]);
 }
 
 /**
@@ -13169,6 +13189,7 @@ gtk_widget_remove_css_class (GtkWidget  *widget,
     return;
 
   gtk_css_node_remove_class (priv->cssnode, class_quark);
+  g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_CSS_CLASSES]);
 }
 
 /**
@@ -13200,3 +13221,56 @@ gtk_widget_has_css_class (GtkWidget  *widget,
 
   return gtk_css_node_has_class (priv->cssnode, class_quark);
 }
+
+/**
+ * gtk_widget_get_css_classes:
+ * @widget: a #GtkWidget
+ *
+ * Returns the list of css classes applied to @widget.
+ *
+ * Returns: (transfer full): a %NULL-terminated list of
+ *   css classes currently applied to @widget. The returned
+ *   list can be freed using g_strfreev.
+ */
+char **
+gtk_widget_get_css_classes (GtkWidget *widget)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+  const GQuark *classes;
+  guint n_classes;
+  char **strv;
+  guint i;
+
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+
+  classes = gtk_css_node_list_classes (priv->cssnode, &n_classes);
+  strv = g_new (char *, n_classes + 1);
+
+  for (i = 0; i < n_classes; i++)
+    strv[i] = g_strdup (g_quark_to_string (classes[i]));
+
+  strv[n_classes] = NULL;
+
+  return strv;
+}
+
+/**
+ * gtk_widget_set_css_classes:
+ * @widget: a #GtkWidget
+ * @classes: (transfer none): %NULL-terminated list
+ *   of css classes to apply to @widget.
+ *
+ * Will clear all css classes applied to @widget
+ * and replace them with @classes.
+ */
+void
+gtk_widget_set_css_classes (GtkWidget   *widget,
+                            const char **classes)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+
+  gtk_css_node_set_classes (priv->cssnode, classes);
+  g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_CSS_CLASSES]);
+}
index 718b3be13b16fd3d4f747718e4502144de1851f8..e97854b93a833d61e41f766de9d02b6a0298a9ab 100644 (file)
@@ -981,6 +981,11 @@ void                    gtk_widget_remove_css_class     (GtkWidget   *widget,
 GDK_AVAILABLE_IN_ALL
 gboolean                gtk_widget_has_css_class        (GtkWidget   *widget,
                                                          const char  *css_class);
+GDK_AVAILABLE_IN_ALL
+char **                 gtk_widget_get_css_classes      (GtkWidget   *widget);
+GDK_AVAILABLE_IN_ALL
+void                    gtk_widget_set_css_classes      (GtkWidget   *widget,
+                                                         const char **classes);